import type { RouteRecordStringComponent } from '@vben/types';

import { requestClient } from '#/api/request';

/**
 * 菜单类型枚举（数字类型，匹配后端）
 */
export enum MenuType {
  /** 按钮 */
  BUTTON = 3,
  /** 目录 */
  DIRECTORY = 1,
  /** 菜单 */
  MENU = 2,
}

/**
 * 菜单类型字符串映射（用于显示）
 */
export const MenuTypeMap: Record<string, string> = {
  DIRECTORY: '目录',
  MENU: '菜单',
  BUTTON: '按钮',
};

/**
 * 菜单数据结构
 */
export interface Menu {
  id?: number;
  parentId: number;
  menuName: string;
  menuType: MenuType | number | string; // 支持字符串和数字类型
  type?: MenuType | number; // 后端返回的字段名可能是 type
  path?: null | string;
  component?: null | string;
  permission?: null | string; // 权限标识（用于权限控制）
  icon?: null | string;
  sort?: number;
  visible?: number;
  link?: null | string; // 外链地址（用于外部链接菜单）
  hasMenu?: boolean; // 角色是否拥有该菜单
  permissions?: MenuPermission[]; // 菜单关联的权限列表（旧版，用于兼容）
  children?: Menu[];
}

/**
 * 菜单权限数据结构（用于角色菜单树）
 */
export interface MenuPermission {
  id?: number;
  permissionName: string;
  permissionCode: string;
  permissionType: number;
  menuId?: number;
  url?: string;
  method?: string;
  hasPermission?: boolean; // 角色是否拥有该权限
}

/**
 * 角色菜单树响应结构
 */
export interface RoleMenuTreeResponse {
  roleId: number;
  roleName: string;
  menus: Menu[];
}

/**
 * 菜单查询参数
 */
export interface MenuQueryParams {
  menuName?: string;
  menuType?: MenuType | number; // 支持数字类型
  visible?: number;
}

/**
 * 获取用户所有菜单（旧接口，保留兼容）
 */
export async function getAllMenusApi() {
  return requestClient.get<RouteRecordStringComponent[]>(
    '/system/api/menu/all',
  );
}

/**
 * 用户权限信息响应结构（对应后端 UserPermissionsVO）
 */
export interface UserPermissionsResponse {
  /** 用户名 */
  username: string;
  /** 角色编码列表 */
  roles: string[];
  /** 菜单权限列表（树形结构） */
  menuPermissions: Menu[];
  /** 按钮权限编码列表 */
  buttonPermissions: string[];
  /** 接口权限列表 */
  apiPermissions: ApiPermission[];
}

/**
 * 接口权限数据结构
 */
export interface ApiPermission {
  /** 权限ID */
  id: number;
  /** 权限编码 */
  permissionCode: string;
  /** 权限名称 */
  permissionName: string;
  /** 权限类型（1-接口权限，2-按钮权限） */
  permissionType: number;
  /** 接口URL */
  url?: string;
  /** 请求方法 */
  method?: string;
  /** 所属菜单ID */
  menuId?: number;
}

/**
 * 获取当前用户权限信息（包含菜单、按钮、接口权限）
 * @param userId 用户ID
 */
export async function getCurrentUserPermissionsApi(userId: number) {
  return requestClient.get<UserPermissionsResponse>(
    '/system/api/menu/getUserMenuTree',
    {
      params: { userId },
    },
  );
}

/**
 * 获取菜单列表（树形结构）
 */
export async function getMenuTreeApi(params?: MenuQueryParams) {
  return requestClient.post<Menu[]>('/system/api/menu/getMenuTree', { params });
}

/**
 * 根据角色ID获取菜单树（包含权限信息）
 */
export async function getMenuTreeByRoleIdApi(roleId: number) {
  return requestClient.post<RoleMenuTreeResponse>(
    `/system/api/rolePermission/${roleId}/tree`,
  );
}

/**
 * 获取菜单详情
 */
export async function getMenuDetailApi(id: number) {
  return requestClient.get<Menu>(`/system/api/menu/${id}`);
}

/**
 * 新增菜单
 */
export async function addMenuApi(data: Menu) {
  return requestClient.post('/system/api/menu/add', data);
}

/**
 * 编辑菜单
 */
export async function updateMenuApi(data: Menu) {
  return requestClient.put('/system/api/menu/edit', data);
}

/**
 * 删除菜单
 */
export async function deleteMenuApi(id: number) {
  return requestClient.delete(`/system/api/menu/delete/${id}`);
}

/**
 * 获取父级菜单选项（用于下拉选择）
 */
export async function getParentMenuOptionsApi() {
  return requestClient.get<Menu[]>('/system/api/menu/parentOptions');
}
